package com.whmall.service.crm.util;

import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
import org.springframework.util.StringUtils;

import static net.sourceforge.pinyin4j.PinyinHelper.toHanyuPinyinStringArray;

/**
 * 拼音工具类
 *
 * @author alex
 * @since 2020/07/21
 */
public class PinyinUtils {
    private final static HanyuPinyinOutputFormat FORMAT_WITHOUT_TONE = new HanyuPinyinOutputFormat();

    static {
        // 输出拼音全部小写
        FORMAT_WITHOUT_TONE.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        // 不带声调
        FORMAT_WITHOUT_TONE.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        FORMAT_WITHOUT_TONE.setVCharType(HanyuPinyinVCharType.WITH_V);
    }

    /**
     * 将文字转为汉语拼音，注意如果参数文本内包含非汉字，则不对其进行转换，并加入到拼音字符串内
     *
     * @param chineseWords 要转成拼音的中文
     * @return 汉字对应的拼音字符串
     */
    public static String toPinyin(String chineseWords) {
        char[] cnChars = chineseWords.trim().toCharArray();
        StringBuilder hanyupinyin = new StringBuilder();
        for (char cnChar : cnChars) {
            try {
                if (String.valueOf(cnChar).matches("[\u4e00-\u9fa5]+")) {
                    // 如果字符是中文,则将中文转为汉语拼音
                    hanyupinyin.append(toHanyuPinyinStringArray(cnChar, FORMAT_WITHOUT_TONE)[0]);
                } else {
                    // 如果字符不是中文,则不转换
                    hanyupinyin.append(cnChar);
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                // 无法转换的忽略掉
            }
        }
        return hanyupinyin.toString();
    }

    /**
     * 将汉字转换为拼音首字母字符串，注意如果参数文本内包含非汉字，则不对其进行转换，将其忽略
     *
     * @param chineseWords 汉字
     * @return 汉字对应的首字母字符串
     */
    public static String toPinyinFirstLetters(String chineseWords) {
        if(!StringUtils.hasText(chineseWords)){
            return "";
        }
        char[] cnChars = chineseWords.trim().toCharArray();
        StringBuilder hanyupinyin = new StringBuilder();

        for (char cnChar : cnChars) {
            try {
                String str = String.valueOf(cnChar);
                // 如果字符是中文,则将中文转为汉语拼音,并取第一个字母
                if (str.matches("[\u4e00-\u9fa5]+")) {
                    hanyupinyin.append(toHanyuPinyinStringArray(cnChar, FORMAT_WITHOUT_TONE)[0], 0, 1);
                }
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                // 无法转换忽略继续
            }
        }

        return hanyupinyin.toString();
    }
}
